package com.yuan.key_code;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
 
import java.io.IOException;
/**
 * HBase操作示例类
 * 包含初始化HBase连接、创建表、插入数据、获取数据和关闭连接等操作
 */
public class ExampleForHBase {
    // HBase配置
    public static Configuration configuration;
    // HBase连接
    public static Connection connection;
    // HBase管理接口
    public static Admin admin;
    
    /**
     * 程序入口
     * @param args 命令行参数
     * @throws IOException 当I/O操作失败时
     */
    public static void main(String[] args)throws IOException{
        //初始化HBase连接和管理接口
        init();

        // 创建表
        createTable("student",new String[]{"score"});
        // 插入数据
        insertData("student","zhangsan","score","English","69");
        insertData("student","zhangsan","score","Math","86");
        insertData("student","zhangsan","score","Computer","77");
        // 获取数据
        getData("student", "zhangsan", "score","English");

        // 关闭HBase连接和管理接口
        close();
    }
 
    /**
     * 初始化HBase配置、连接和管理接口
     */
    public static void init(){
        // 创建HBase配置
        configuration  = HBaseConfiguration.create();
        // 设置HBase在HDFS上的根目录
        configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
        try{
            // 创建HBase连接
            connection = ConnectionFactory.createConnection(configuration);
            // 获取HBase管理接口
            admin = connection.getAdmin();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
 
    /**
     * 关闭HBase管理接口和连接
     */
    public static void close(){
        try{
            // 关闭HBase管理接口
            if(admin != null){
                admin.close();
            }
            // 关闭HBase连接
            if(null != connection){
                connection.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
 
    /**
     * 创建HBase表
     * @param myTableName 表名
     * @param colFamily 列族数组
     * @throws IOException 当表操作失败时
     */
    public static void createTable(String myTableName,String[] colFamily) throws IOException {
        TableName tableName = TableName.valueOf(myTableName);
        if(admin.tableExists(tableName)){
            System.out.println("table is exists!");
        }else {
            TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);//创建表描述器并指明表名
            for(String str:colFamily){//遍历列族
                ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();
                tableDescriptor.setColumnFamily(family);//添加列族
            }
            admin.createTable(tableDescriptor.build());//创建表
        } 
    }
 
    /**
     * 向HBase表中插入数据
     * @param tableName 表名
     * @param rowKey 行键
     * @param colFamily 列族
     * @param col 列
     * @param val 值
     * @throws IOException 当数据插入失败时
     */
    public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException { 
        Table table = connection.getTable(TableName.valueOf(tableName));

        Put put = new Put(rowKey.getBytes());//创建Put对象（相当于表的一行），指定行键
        put.addColumn(colFamily.getBytes(),col.getBytes(), val.getBytes());
        table.put(put);

        table.close(); 
    }
 
    /**
     * 从HBase表中获取数据
     * @param tableName 表名
     * @param rowKey 行键
     * @param colFamily 列族
     * @param col 列
     * @throws IOException 当数据获取失败时
     */
    public static void getData(String tableName,String rowKey,String colFamily, String col)throws  IOException{ 
        Table table = connection.getTable(TableName.valueOf(tableName));

        Get get = new Get(rowKey.getBytes());//创建Get对象，指定行键
        get.addColumn(colFamily.getBytes(),col.getBytes());
        Result result = table.get(get);

        System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
        table.close(); 
    }
}